/*
 * @Author: yushuang
 * @Date: 2024-11-13 10:47:57
 * @LastEditors: yushuang
 * @LastEditTime: 2024-12-02 11:41:00
 * @Description:
 */
import router from '@/router/index';
import { LOGIN_URL, microApps } from '@/config';
import { ElNotification } from 'element-plus';
import { useAuthStore } from '@/store/modules/auth';
import { removeToken } from '@/utils/cookies';

// 引入 views 文件夹下所有 vue 文件
const modules = import.meta.glob('/src/views/**/*.vue');

const isProd = import.meta.env.VITE_APP_ENV === 'production';

/**
 * @description: 获取子应用承载组件
 * @param name 子应用组件名字
 * @return
 */
const getMicroComponent = async (name: string) => {
  const cpn = await import('@/layout/microAppLayout.vue');
  cpn.default.name = name;
  return cpn;
};
/**
 * @description: 增加微应用配置
 * @param item 当前路由项
 * @return
 */
const matchMicroApp = async (item: any) => {
  const microApp = microApps.find(x => item.path?.startsWith(`/${x.name}`));
  // 匹配当前路由如果是微应用，则增加微应用配置
  if (microApp) {
    item.component = getMicroComponent(`${microApp.name}`);
    item.meta.microApp = {
      ...microApp,
      entry: isProd ? microApp.entries.product : microApp.entries.dev,
      // 下发数据
      props: {}
    };
  }
};
/**
 * @description 初始化动态路由
 */
export const initDynamicRouter = async () => {
  const authStore = useAuthStore();

  try {
    // 获取菜单列表
    await authStore.getAuthMenuList();
    // 获取按钮
    await authStore.getAuthButtonList();
    // 2.判断当前用户有没有菜单权限
    if (!authStore.authMenuListGet.length) {
      ElNotification({
        title: '无权限访问',
        message: '当前账号无任何菜单权限，请联系系统管理员！',
        type: 'warning',
        duration: 3000
      });
      removeToken();
      router.replace(LOGIN_URL);
      return Promise.reject('No permission');
    }

    // 3.添加动态路由
    authStore.flatMenuListGet.forEach((item: any) => {
      item.children && delete item.children;
      if (item.component && typeof item.component == 'string') {
        item.component = modules['/src/views' + item.component + '.vue'];
      }
      // 匹配装载微应用
      matchMicroApp(item);
      if (item.meta.isFull) {
        router.addRoute(item);
      } else {
        router.addRoute('layout', item);
      }
    });
  } catch (error) {
    // 当按钮 || 菜单请求出错时，重定向到登陆页
    removeToken();
    router.replace(LOGIN_URL);
    return Promise.reject(error);
  }
};
